/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFileChooser;
import trunk.model.Dessin;
import trunk.model.ElementGeo;
import trunk.model.PaintModel;
import trunk.model.Point;


/**
 * Class MenuPrincipal 
 * 
 * Components representant le menu principal de l'application
 * 
 * @author LEFEVRE Michael
 * @author THOUE Jonathan
 */
public class MenuPrincipal extends JMenuBar {
        JMenu menuFichier;
        JMenu menuEditer;
        JMenu menuGroupe;
        JMenu menuCouleur;
        JMenu menuOutils;
        
        PaintModel model;
        /**
         * Constructeur par défaut de la classe
         */
    public MenuPrincipal() {

    }
        /**
         * Constructeur de la classe
         *  @param frame - lien vers la fenetre principal
         * @param pModel - lien vers le model
         */
    public MenuPrincipal(final Paint frame,final PaintModel pModel){
        model=pModel;
        menuFichier = new JMenu("Fichier");//
        menuFichier.setMnemonic(KeyEvent.VK_A);        
        JMenuItem menuNouveau = new JMenuItem("Nouveau");
        JMenuItem menuEnregistrer = new JMenuItem("Enregistrer",KeyEvent.VK_T);
        JMenuItem menuOuvrir = new JMenuItem("Ouvrir");
        JMenuItem menuExit = new JMenuItem("Exit");
        
        menuNouveau.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
               frame.getTabbed().addTab("Sans Nom", new EnvironnementDessin(new PaintModel()));
            }
        });
        
        menuEnregistrer.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_S, ActionEvent.CTRL_MASK));
        menuEnregistrer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                ObjectOutputStream oos;
                JFileChooser popup = new JFileChooser();
                            if ( popup.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION)
                try {
                    oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File(popup.getSelectedFile().getPath()))));
                    String[] Chemin_du_fichier = popup.getSelectedFile().getPath().split("\\\\");
                    ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().setTitle(Chemin_du_fichier[Chemin_du_fichier.length-1]);
                    
                    oos.writeObject(((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().getDessin());
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                 }
            }
        });
        
           
        menuOuvrir.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_O, ActionEvent.CTRL_MASK));
        menuOuvrir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {//debut
                ObjectInputStream ois;
                JFileChooser popup = new JFileChooser();
                            if ( popup.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION)
                try {
                    ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File(popup.getSelectedFile().getPath()))));
                    
                    PaintModel ouvrirModel = new PaintModel();                    
                    ouvrirModel.setDessin((Dessin)ois.readObject());                       
                        
                    frame.getTabbed().addTab(ouvrirModel.getDessin().getName(), new EnvironnementDessin(ouvrirModel));
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                 }catch (ClassNotFoundException e2) {
                    e2.printStackTrace(); }//Fin
            }
        });
        
        /**
        *Creer la fonction du bouton menuExit
        *
        */
        menuExit.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_Q, ActionEvent.CTRL_MASK));
        menuExit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                System.exit(0);
            }
        });
                
        menuEditer = new JMenu("Editer");
        menuEditer.setMnemonic(KeyEvent.VK_A);
        
        
        JMenuItem menuAnnuler = new JMenuItem("Annuler");
        JMenuItem menuSelectAll = new JMenuItem("Sélectionner Tout" );
        JMenuItem deselect = new JMenuItem("Désélectionner Tout" );
        JMenuItem symetrieO = new JMenuItem("Symetrie Origine" );
        JMenuItem symetrieX = new JMenuItem("Symetrie Par X" );
        JMenuItem symetrieY = new JMenuItem("Symetrie Par Y" );
        JMenuItem delete = new JMenuItem("Delete");
        JMenuItem duplicate = new JMenuItem("Cloner");
        
        menuAnnuler.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_Z, ActionEvent.CTRL_MASK));
        menuAnnuler.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().annuler();
            }
        });
        
        menuSelectAll.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionevent){
               ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().selectAll();
            }
        });
        
        deselect.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionevent){
                ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().resetSelection();
            }
        });
            
            symetrieO.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionevent)
                {
                    ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().symetrieO();
                }
            });
            
            symetrieX.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionevent)
                {
                    ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().symetrieX();
                }
            });
            
            symetrieY.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionevent)
                {
                    ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().symetrieY();
                }
            });
            
            delete.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionevent)
                {
                    ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().delete();
                }
            });
            duplicate.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionevent)
            {
                ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().cloneElement();
            }
        }); 
        
        
        menuGroupe = new JMenu("Groupe");
        
        JMenuItem group = new JMenuItem("Grouper" );
        JMenuItem degroup = new JMenuItem("Dégrouper");
        
        group.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionevent)
                {
                    ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().group();
                    
                }
            });

            degroup.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionevent)
                {
                    ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().deGroup();
                }
            });
        menuCouleur = new JMenu("Couleur");
        JMenuItem newCouleur = new JMenuItem("Couleur personnalisée");
        
        newCouleur.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionevent)
                {
                    frame.getAjoutCouleur().setVisible(true);
                }
            });
        menuOutils = new JMenu("Outils");
        JMenuItem resetAxe = new JMenuItem("Réinitialisé l'axe");
        
        resetAxe.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionevent)
                {
                    ((EnvironnementDessin)frame.getTabbed().getSelectedComponent()).getModel().setOrigine(new Point(460,500));
                }
            });
            
            
        menuFichier.add(menuNouveau);
        menuFichier.add(menuEnregistrer);
        menuFichier.add(menuOuvrir);
        menuFichier.add(menuExit);
        
        menuEditer.add(menuAnnuler);
        menuEditer.addSeparator();
        menuEditer.add(menuSelectAll);
        menuEditer.add(deselect);
        menuEditer.addSeparator();
        menuEditer.add(symetrieO);
        menuEditer.add(symetrieX);
        menuEditer.add(symetrieY);
        menuEditer.add(duplicate);
        menuEditer.addSeparator();
        menuEditer.add(delete);
        
        
        menuGroupe.add(group);
        menuGroupe.add(degroup);
        
        menuCouleur.add(newCouleur);
        
        menuOutils.add(resetAxe);
        
        this.add(menuFichier);
        this.add(menuEditer);        
        this.add(menuGroupe);
        this.add(menuCouleur);
        this.add(menuOutils);
    }
    /**
    *Get Model
    *@return modele
    */
    public PaintModel getModel() {
        return model;
    }
    /**
    *Set Model
    *@param model - modele
    */
    public void setModel(PaintModel model) {
        this.model = model;
    }

}
